// pages/link/link.js
const app = getApp();
Page({

  /**
   * 页面的初始数据
   */
  data: {
    level: 0, // 设备 1是1.0设备 2是2.0设备
    show: false, //是否展示搜索动画
    BLEList: [], // 蓝牙列表
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /****************1.蓝牙初始化***************/
  BLEInit() {
    wx.openBluetoothAdapter({
      success: (res) => {
        this.setData({
          show: true
        })
        this.BLEState()
      },
      fail: (res) => {
        app.Toast('请打开蓝牙和定位功能!');
        wx.stopPullDownRefresh()
        setTimeout(() => {
          this.setData({
            show: false
          })
        },2000)
      }
    })
  },
  /****************2.获取蓝牙状态***************/
  BLEState() {
    wx.getBluetoothAdapterState({
      success: (res) => {
        this.BLESearch()
      },
      fail: (res) => {
        app.Toast('蓝牙状态错误,请重新打开小程序');
        this.setData({
          show: false
        })
      }
    })
  },
  /****************3.搜索附近蓝牙***************/
  BLESearch() {
    wx.startBluetoothDevicesDiscovery({
      success: (res) => {
        console.log('开始扫描!', res);
        this.BLEGetDevices()
      }
    });
  },
  /****************4.获取蓝牙设备***************/
  BLEGetDevices() {
    wx.getBluetoothDevices({
      success: (res) => {
        console.log('已经发现的所有蓝牙设备', res.devices);
        let arr = [];
        // 查找氛围灯蓝牙设备
        res.devices.forEach(v => {
          console.log(v.name, v.name)
          // if (v.name != "") {
          if (v.name == 'BT201-BLE' || v.name == "MCFWD") {
            arr.push(v)
          }
        })
        // 找到氛围灯蓝牙设备直接展示
        if (arr.length > 0) {
        // if (arr.length) {
          this.setData({
            BLEList: arr,
            show: false
          })
          wx.stopPullDownRefresh();
        } else {
          // 未找到延迟15s后提示
          setTimeout(() => {
            if(this.data.show){
              app.Toast('未找到蓝牙，请重试！');
              this.setData({
                show: false
              })
            }else{
            }
            wx.stopPullDownRefresh();
          },8000)
        }
        //发现蓝牙新设备事件
        wx.onBluetoothDeviceFound(res => {
          console.log('发现新设备', res.devices);
          let list = [], oldData = this.data.BLEList, newData = [];
          // 判断新设备是不是氛围灯设备
          res.devices.forEach(v => {
            // if (v.name != '') {
            if (v.name.indexOf('BT201-BLE') != -1 || v.name.indexOf("MCFWD") != -1) {
              list.push(v)
            }
          })
          // 一开始未找到设备 发现新设备找到氛围灯设备时直接展示
          if(list.length > 0 && oldData.length < 1){
            this.setData({
              BLEList: list,
              show: false
            })
            return
          }
          // 一开始找到了设备 发现新设备又找到氛围灯设备时
          if(list.length > 0 && oldData.length > 0){
            list.forEach((item) => {
              this.data.BLEList.find((value) => {
                if(value.deviceId != item.deviceId || value.name != item.name){
                  newData.push(item)
                }
              })
            })
            this.setData({
              BLEList: this.data.BLEList.length > 0 ? this.data.BLEList.concat(this.unique(newData)) : this.unique(newData),
              show: false
            },() => {console.log(this.data.BLEList,123123123)})
          }

        })
      }
    })
  },
  // 数组去重
  unique(arr) {
    return Array.from(new Set(arr))
  },

  /****************5.链接蓝牙***************/
  BLEConnect(e) {
    const that = this;
    wx.showLoading({
      title: '设备连接中...',
      mask: true
    })
    const BLE = e.currentTarget.dataset.info;
    wx.createBLEConnection({
      deviceId: BLE.deviceId,
      success: (res) => {
        wx.hideLoading();
        if(BLE.name.indexOf("BT201-BLE") == -1 && BLE.name.indexOf("MCFWD") == -1){
          app.Toast('请确认是否连接正确的设备!');
          return
        }
        app.globalData.hasConnect = true;
        that.setData({
          level: BLE.name.indexOf("BT201-BLE") != -1 ? 1 : (BLE.name.indexOf("MCFWD") != -1 ? 2 : '')
        })
        app.globalData.level = BLE.name.indexOf("BT201-BLE") != -1 ? 1 : (BLE.name.indexOf("MCFWD") != -1 ? 2 : '');
        console.log('链接成功=========》', res, BLE.name.indexOf("BT201-BLE"), BLE.name);
        app.Toast('连接成功～', 'success');
        setTimeout(() => {
          if(BLE.name.indexOf("BT201-BLE") != -1){
            wx.switchTab({
              url: '/pages/index/index',
            })
          }
          if(BLE.name.indexOf("MCFWD") != -1){
            wx.switchTab({
              url: '/pages/control/control',
            })
          }
        },1600)
        wx.stopBluetoothDevicesDiscovery(); //  停止搜索蓝牙
        wx.onBLEConnectionStateChange((res) => {
          // 该方法回调中可以用于处理连接意外断开等异常情况
          if (!res.connected) {
            app.Toast('蓝牙已断开')
            app.globalData.deviceId = null; //蓝牙id
            app.globalData.serviceId = null; //蓝牙服务id
            app.globalData.characteristicId = null; //蓝牙特征值id
            that.BLEGetDevices()
          }
          console.log(res)
        })
        this.BLEGetservice(BLE);
        app.globalData.deviceId = BLE.deviceId;
      },
      fail: (err) => {
        wx.hideLoading();
        if (err.errCode == -1) {
          // errCode==-1 已链接蓝牙，重复链接失败
          return
        }
        app.Toast('连接失败!')
        console.log('链接失败原因', err);

      },
    })

  },
  /****************6.获取蓝牙服务***************/
  BLEGetservice(BLE) {
    wx.getBLEDeviceServices({
      // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
      deviceId: BLE.deviceId,
      success: (res) => {
        console.log('获取蓝牙服务', res);
        this.BLEGetCharacteristics(BLE, res.services[0]);
        app.globalData.serviceId = res.services[0].uuid
      }
    })
  },
  /****************7.获取所有的特征值***************/
  BLEGetCharacteristics(BLE, SERVER) {
    wx.getBLEDeviceCharacteristics({
      // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
      deviceId: BLE.deviceId,
      // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
      serviceId: SERVER.uuid,
      success: (res) => {
        console.log('获取所有的特征值', res)
        this.BLECharacteristicValueChange(BLE, SERVER, res.characteristics);
        app.globalData.characteristicId = res.characteristics[0].uuid
      }
    })
  },
  /****************8.启用特征值变化***************/
  BLECharacteristicValueChange(BLE, SERVER, CHARACTERISTIC) {
    wx.notifyBLECharacteristicValueChange({
      state: true,
      deviceId: BLE.deviceId,
      serviceId: SERVER.uuid,
      characteristicId: CHARACTERISTIC[0].uuid,
      success: (res) => {
        console.log('特征值发生变化', res)
        this.BLEDataRecieve(BLE, SERVER, CHARACTERISTIC)
      },
      fail: (err) => {
        console.log('启动notify失败:' + JSON.stringify(err));
      },
    })
  },
  /****************9.接收蓝牙的返回数据***************/
  BLEDataRecieve(BLE, SERVER, CHARACTERISTIC) {
    console.log('开始接受数据=>');
    wx.onBLECharacteristicValueChange((res) => {
      console.log('已经接受数据---------------------', JSON.stringify(res.value));
      console.log(this.receiveData(res.value));
    })
  },

  /*转换成需要的格式*/
  buf2string(buffer) {
    var arr = Array.prototype.map.call(new Uint8Array(buffer), x => x)
    return arr.map((char, i) => {
      return String.fromCharCode(char);
    }).join('');
  }, 
  receiveData(buf) {
    return this.hexCharCodeToStr(this.ab2hex(buf))
  }, 
  /*转成二进制*/ ab2hex(buffer) {
    var hexArr = Array.prototype.map.call(new Uint8Array(buffer), function (bit) {
      return ('00' + bit.toString(16)).slice(-2)
    })
    return hexArr.join('')
  }, 
  /*转成可展会的文字*/ 
  hexCharCodeToStr(hexCharCodeStr) {
    var trimedStr = hexCharCodeStr.trim();
    var rawStr = trimedStr.substr(0, 2).toLowerCase() === '0x' ? trimedStr.substr(2) : trimedStr;
    var len = rawStr.length;
    var curCharCode;
    var resultStr = [];
    for (var i = 0; i < len; i = i + 2) {
      curCharCode = parseInt(rawStr.substr(i, 2), 16);
      resultStr.push(String.fromCharCode(curCharCode));
    }
    return resultStr.join('');
  },

  onPullDownRefresh(){
    this.BLEInit()
  },

  //分享好友
  onShareAppMessage() {

  },

})